iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
AI & Data

圍繞 AI & Data 的主題系列 第 6

[Day 6] 資料視覺化 (Data Visualization) (中)

  • 分享至 

  • xImage
  •  

Hello 大家好!歡迎回來!昨天剛剛分享完資料視覺化 (Data Visualization)的簡介跟工具,那今天我打算跟大家分享資料視覺化 (Data Visualization)的 Python 可視化圖表。事不宜遲,現在開始!

Python 可視化圖表

1. 小提琴圖

小提琴圖可以將一組或多組數據的數值變量分佈可視化。Python 和圖表如下:

import seaborn as sns
import matplotlib.pyplot as plt

# 加載數據
df = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 繪圖顯示
sns.violinplot(x=df["species"], y=df["sepal_length"])
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226mjbL7G9QtJ.png

2. 核密度估計圖

核密度估計圖可以可視化一個或多個組的數值變量的分佈,非常適合大型數據集。

import seaborn as sns
import matplotlib.pyplot as plt

# 加載數據
df = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 繪圖顯示
sns.kdeplot(df['sepal_width'])
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/201632260enLEv0VxU.png

3. 直方圖

直方圖可視化一組或多組數據的分佈情況。

import seaborn as sns
import matplotlib.pyplot as plt

# 加載數據
df = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 繪圖顯示
sns.distplot(a=df["sepal_length"], hist=True, kde=False, rug=False)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226diPTYHrGVY.png

4. 箱形圖

箱形圖可以快速獲得中位數、四分位數和異常值,但也隱藏數據集的各個數據點。

import seaborn as sns
import matplotlib.pyplot as plt

# 加載數據
df = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 繪圖顯示
sns.boxplot(x=df["species"], y=df["sepal_length"])
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226xV7chGJewF.png

5. 山脊線圖

山脊線圖總結幾組數據的分佈情況。每個組都表示爲一個密度圖,每個密度圖相互重疊以更有效地利用空間。

import plotly.graph_objects as go
import numpy as np
import pandas as pd

# 讀取數據
temp = pd.read_csv('2016-weather-data-seattle.csv')
# 數據處理, 時間格式轉換
temp['year'] = pd.to_datetime(temp['Date']).dt.year

# 選擇幾年的數據展示即可
year_list = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
temp = temp[temp['year'].isin(year_list)]

# 繪製每年的直方圖,以年和平均溫度分組,並使用'count'函數進行彙總
temp = temp.groupby(['year', 'Mean_TemperatureC']).agg({'Mean_TemperatureC': 'count'}).rename(columns={'Mean_TemperatureC': 'count'}).reset_index()

# 使用Plotly繪製脊線圖,每個軌跡對應於特定年份的溫度分佈
# 將每年的數據(溫度和它們各自的計數)存儲在單獨的數組,並將其存儲在字典中以方便檢索
array_dict = {}
for year in year_list:
    # 每年平均溫度
    array_dict[f'x_{year}'] = temp[temp['year'] == year]['Mean_TemperatureC']
    # 每年溫度計數
    array_dict[f'y_{year}'] = temp[temp['year'] == year]['count']
    array_dict[f'y_{year}'] = (array_dict[f'y_{year}'] - array_dict[f'y_{year}'].min()) \
                              / (array_dict[f'y_{year}'].max() - array_dict[f'y_{year}'].min())

# 創建一個圖像對象
fig = go.Figure()
for index, year in enumerate(year_list):
    # 使用add_trace()繪製軌跡
    fig.add_trace(go.Scatter(
        x=[-20, 40], y=np.full(2, len(year_list) - index),
        mode='lines',
        line_color='white'))

    fig.add_trace(go.Scatter(
        x=array_dict[f'x_{year}'],
        y=array_dict[f'y_{year}'] + (len(year_list) - index) + 0.4,
        fill='tonexty',
        name=f'{year}'))

    # 添加文本
    fig.add_annotation(
        x=-20,
        y=len(year_list) - index,
        text=f'{year}',
        showarrow=False,
        yshift=10)

# 添加標題、圖例、xy軸參數
fig.update_layout(
    title='1950年~2010年西雅圖平均溫度',
    showlegend=False,
    xaxis=dict(title='單位: 攝氏度'),
    yaxis=dict(showticklabels=False)
)

# 跳轉網頁顯示
fig.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226eZO7tJxz8H.png

6. 散點圖

散點圖顯示 2 個數值變量之間的關係。

import seaborn as sns
import matplotlib.pyplot as plt

# 加載數據
df = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 繪圖顯示
sns.regplot(x=df["sepal_length"], y=df["sepal_width"])
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226iS0CBM4u0I.png

7. 矩形熱力圖

矩形熱力圖矩陣中的每個值都被表示爲一個顏色數據。

import seaborn as sns
import pandas as pd
import numpy as np

# Create a dataset
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])

# Default heatmap
p1 = sns.heatmap(df)

https://ithelp.ithome.com.tw/upload/images/20230917/20163226OU85b9ngtN.png

8. 相關性圖

相關性圖分析每對數據變量之間的關係。

import seaborn as sns
import matplotlib.pyplot as plt

# 加載數據
df = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 繪圖顯示
sns.pairplot(df)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226yQm9zOQVGw.png

9. 氣泡圖

氣泡圖就是一個散點圖,其中圓圈大小被映射到第三數值變量的值。

import matplotlib.pyplot as plt
import seaborn as sns
from gapminder import gapminder

# 導入數據
data = gapminder.loc[gapminder.year == 2007]

# 使用scatterplot創建氣泡圖
sns.scatterplot(data=data, x="gdpPercap", y="lifeExp", size="pop", legend=False, sizes=(20, 2000))

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226PTR0SZ7h6R.png

10. 連接散點圖

連接散點圖就是一個線圖,其中每個數據點由圓形或任何類型的標記展示。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 創建數據
df = pd.DataFrame({'x_axis': range(1, 10), 'y_axis': np.random.randn(9) * 80 + range(1, 10)})

# 繪製顯示
plt.plot('x_axis', 'y_axis', data=df, linestyle='-', marker='o')
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226W7BtJH72zs.png

11. 二維密度圖

二維密度圖是在 X 軸上表示一個變量,另一個在 Y 軸上,就像散點圖,然後計算二維空間特定區域內的次數,並用顏色漸變表示。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kde

# 創建數據, 200個點
data = np.random.multivariate_normal([0, 0], [[1, 0.5], [0.5, 3]], 200)
x, y = data.T

# 創建畫布, 6個子圖
fig, axes = plt.subplots(ncols=6, nrows=1, figsize=(21, 5))

# 第一個子圖, 散點圖
axes[0].set_title('Scatterplot')
axes[0].plot(x, y, 'ko')

# 第二個子圖, 六邊形
nbins = 20
axes[1].set_title('Hexbin')
axes[1].hexbin(x, y, gridsize=nbins, cmap=plt.cm.BuGn_r)

# 2D 直方圖
axes[2].set_title('2D Histogram')
axes[2].hist2d(x, y, bins=nbins, cmap=plt.cm.BuGn_r)

# 高斯kde
k = kde.gaussian_kde(data.T)
xi, yi = np.mgrid[x.min():x.max():nbins * 1j, y.min():y.max():nbins * 1j]
zi = k(np.vstack([xi.flatten(), yi.flatten()]))

# 密度圖
axes[3].set_title('Calculate Gaussian KDE')
axes[3].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='auto', cmap=plt.cm.BuGn_r)

# 添加陰影
axes[4].set_title('2D Density with shading')
axes[4].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='gouraud', cmap=plt.cm.BuGn_r)

# 添加輪廓
axes[5].set_title('Contour')
axes[5].pcolormesh(xi, yi, zi.reshape(xi.shape), shading='gouraud', cmap=plt.cm.BuGn_r)
axes[5].contour(xi, yi, zi.reshape(xi.shape))

plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226KaLHoHETnd.png

12. 條形圖

條形圖表示多個明確的變量的數值關係,每個變量都爲一個條形,條形的大小代表其數值。

import numpy as np
import matplotlib.pyplot as plt

# 生成隨機數據
height = [3, 12, 5, 18, 45]
bars = ('A', 'B', 'C', 'D', 'E')
y_pos = np.arange(len(bars))

# 創建條形圖
plt.bar(y_pos, height)

# x軸標籤
plt.xticks(y_pos, bars)

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226cKyxNJJ7HR.png

13. 雷達圖

雷達圖可以可視化多個定量變量的一個或多個系列的值。每個變量都有自己的軸,所有軸都連接在圖形的中心。

import matplotlib.pyplot as plt
import pandas as pd
from math import pi

# 設置數據
df = pd.DataFrame({
    'group': ['A', 'B', 'C', 'D'],
    'var1': [38, 1.5, 30, 4],
    'var2': [29, 10, 9, 34],
    'var3': [8, 39, 23, 24],
    'var4': [7, 31, 33, 14],
    'var5': [28, 15, 32, 14]
})

# 目標數量
categories = list(df)[1:]
N = len(categories)

# 角度
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]

# 初始化
ax = plt.subplot(111, polar=True)

# 設置第一處
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)

# 添加背景信息
plt.xticks(angles[:-1], categories)
ax.set_rlabel_position(0)
plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7)
plt.ylim(0, 40)

# 添加數據圖

# 第一個
values = df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group A")
ax.fill(angles, values, 'b', alpha=0.1)

# 第二個
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group B")
ax.fill(angles, values, 'r', alpha=0.1)

# 添加圖例
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226VRRvrXpc7O.png

14. 詞雲圖

詞雲圖是文本數據的視覺表示。

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 添加詞語
text=("Python Python Python Matplotlib Chart Wordcloud Boxplot")

# 創建詞雲對象
wordcloud = WordCloud(width=480, height=480, margin=0).generate(text)

# 顯示詞雲圖
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.margins(x=0, y=0)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226cqLa98Sda4.png

15. 平行座標圖

一個平行座標圖能夠比較不同系列相同屬性的數值情況。

import seaborn as sns
import matplotlib.pyplot as plt
from pandas.plotting import parallel_coordinates

# 讀取數據
data = sns.load_dataset('iris', data_home='seaborn-data', cache=True)

# 創建圖表
parallel_coordinates(data, 'species', colormap=plt.get_cmap("Set2"))

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226XnswwujjQH.png

16. 棒棒糖圖

棒棒糖圖其實就是柱狀圖的變形,顯示一個線段和一個圓。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 創建數據
df = pd.DataFrame({'group': list(map(chr, range(65, 85))), 'values': np.random.uniform(size=20) })

# 排序取值
ordered_df = df.sort_values(by='values')
my_range = range(1, len(df.index)+1)

# 創建圖表
plt.stem(ordered_df['values'])
plt.xticks(my_range, ordered_df['group'])

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226nbI58jY4dP.png

17. 徑向柱圖

徑向柱圖同樣也是條形圖的變形,但是使用極座標而不是直角座標系。(繪製起來有點麻煩,而且比柱狀圖準確度低 >:(

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 生成數據
df = pd.DataFrame(
        {
            'Name': ['item ' + str(i) for i in list(range(1, 51)) ],
            'Value': np.random.randint(low=10, high=100, size=50)
        })

# 排序
df = df.sort_values(by=['Value'])

# 初始化畫布
plt.figure(figsize=(20, 10))
ax = plt.subplot(111, polar=True)
plt.axis('off')

# 設置圖表參數
upperLimit = 100
lowerLimit = 30
labelPadding = 4

# 計算最大值
max = df['Value'].max()

# 數據下限10, 上限100
slope = (max - lowerLimit) / max
heights = slope * df.Value + lowerLimit

# 計算條形圖的寬度
width = 2*np.pi / len(df.index)

# 計算角度
indexes = list(range(1, len(df.index)+1))
angles = [element * width for element in indexes]

# 繪製條形圖
bars = ax.bar(
    x=angles,
    height=heights,
    width=width,
    bottom=lowerLimit,
    linewidth=2,
    edgecolor="white",
    color="#61a4b2",
)

# 添加標籤
for bar, angle, height, label in zip(bars,angles, heights, df["Name"]):

    # 旋轉
    rotation = np.rad2deg(angle)

    # 翻轉
    alignment = ""
    if angle >= np.pi/2 and angle < 3*np.pi/2:
        alignment = "right"
        rotation = rotation + 180
    else:
        alignment = "left"

    # 最後添加標籤
    ax.text(
        x=angle,
        y=lowerLimit + bar.get_height() + labelPadding,
        s=label,
        ha=alignment,
        va='center',
        rotation=rotation,
        rotation_mode="anchor")

plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226xG1lHtSXnP.png

18. 矩形樹圖

矩形樹圖是一種常見的表達「層級數據」「樹狀數據」的可視化形式。

import matplotlib.pyplot as plt
import squarify
import pandas as pd

# 創建數據
df = pd.DataFrame({'nb_people': [8, 3, 4, 2], 'group': ["group A", "group B", "group C", "group D"]})

# 繪圖顯示
squarify.plot(sizes=df['nb_people'], label=df['group'], alpha=.8 )
plt.axis('off')
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226IlKAYMPa0t.png

19. 維恩圖

維恩圖顯示不同組之間所有可能的關係。(對,就那麽短)

import matplotlib.pyplot as plt
from matplotlib_venn import venn2

# 創建圖表
venn2(subsets=(10, 5, 2), set_labels=('Group A', 'Group B'))

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226acalyvxm55.png

20. 圓環圖

圓環圖本質上就是一個餅圖,只是中間切掉了一個區域。(真的很莫名其妙)

import matplotlib.pyplot as plt

# 創建數據
size_of_groups = [12, 11, 3, 30]

# 生成餅圖
plt.pie(size_of_groups)

# 在中心添加一個圓, 生成環形圖
my_circle = plt.Circle((0, 0), 0.7, color='white')
p = plt.gcf()
p.gca().add_artist(my_circle)

plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226RcjnH4oH8D.png

21. 餅圖

其實就跟上面的一樣,只是中間的部分回來了。

import matplotlib.pyplot as plt

# 創建數據
size_of_groups = [12, 11, 3, 30]

# 生成餅圖
plt.pie(size_of_groups)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226UkvLLqqCli.png

22. 樹圖

樹圖主要用來可視化樹形數據結構,是一種特殊的層次類型。(看到我眼花)

import pandas as pd
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# 讀取數據
df = pd.read_csv('mtcars.csv')
df = df.set_index('model')

# 計算每個樣本之間的距離
Z = linkage(df, 'ward')

# 繪圖
dendrogram(Z, leaf_rotation=90, leaf_font_size=8, labels=df.index)

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226XoLAsuNC0U.png

23. 氣泡圖 2.0(?)

是的,你沒看錯,這是2.0版本(?)。前面説的是類似散點圖,而這個是用圓形表示層次結構及數值大小。

import circlify
import matplotlib.pyplot as plt

# 創建畫布, 包含一個子圖
fig, ax = plt.subplots(figsize=(14, 14))

# 標題
ax.set_title('Repartition of the world population')

# 移除座標軸
ax.axis('off')

# 人口數據
data = [{'id': 'World', 'datum': 6964195249, 'children': [
              {'id': "North America", 'datum': 450448697,
                  'children': [
                     {'id': "United States", 'datum': 308865000},
                     {'id': "Mexico", 'datum': 107550697},
                     {'id': "Canada", 'datum': 34033000}
                   ]},
              {'id': "South America", 'datum': 278095425,
                  'children': [
                     {'id': "Brazil", 'datum': 192612000},
                     {'id': "Colombia", 'datum': 45349000},
                     {'id': "Argentina", 'datum': 40134425}
                   ]},
              {'id': "Europe", 'datum': 209246682,
                  'children': [
                     {'id': "Germany", 'datum': 81757600},
                     {'id': "France", 'datum': 65447374},
                     {'id': "United Kingdom", 'datum': 62041708}
                   ]},
              {'id': "Africa", 'datum': 311929000,
                  'children': [
                     {'id': "Nigeria", 'datum': 154729000},
                     {'id': "Ethiopia", 'datum': 79221000},
                     {'id': "Egypt", 'datum': 77979000}
                   ]},
              {'id': "Asia", 'datum': 2745929500,
                  'children': [
                     {'id': "China", 'datum': 1336335000},
                     {'id': "India", 'datum': 1178225000},
                     {'id': "Indonesia", 'datum': 231369500}
                   ]}
    ]}]

# 使用circlify()計算, 獲取圓的大小, 位置
circles = circlify.circlify(
    data,
    show_enclosure=False,
    target_enclosure=circlify.Circle(x=0, y=0, r=1)
)


lim = max(
    max(
        abs(circle.x) + circle.r,
        abs(circle.y) + circle.r,
    )
    for circle in circles
)
plt.xlim(-lim, lim)
plt.ylim(-lim, lim)

for circle in circles:
    if circle.level != 2:
        continue
    x, y, r = circle
    ax.add_patch(plt.Circle((x, y), r, alpha=0.5, linewidth=2, color="lightblue"))

for circle in circles:
    if circle.level != 3:
        continue
    x, y, r = circle
    label = circle.ex["id"]
    ax.add_patch(plt.Circle((x, y), r, alpha=0.5, linewidth=2, color="#69b3a2"))
    plt.annotate(label, (x, y), ha='center', color="white")

for circle in circles:
    if circle.level != 2:
        continue
    x, y, r = circle
    label = circle.ex["id"]
    plt.annotate(label, (x, y), va='center', ha='center', bbox=dict(facecolor='white', edgecolor='black', boxstyle='round', pad=.5))

plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226TV8WBjZkYs.png

24. 折線圖

折線圖是將各個數據點標誌連接起來的圖表,用於展現數據的變化趨勢。

import matplotlib.pyplot as plt
import numpy as np

# 創建數據
values = np.cumsum(np.random.randn(1000, 1))

# 繪製圖表
plt.plot(values)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226d3HBMlXXuc.png

25. 面積圖

面積圖和折線圖非常相似,區別在於面積圖會在 x 座標軸間會填充顏色。

import matplotlib.pyplot as plt

# 創建數據
x = range(1, 6)
y = [1, 4, 6, 8, 4]

# 生成圖表
plt.fill_between(x, y)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226aOCWLF1Y6b.png

26. 堆疊面積圖

這比較像是面積圖的 2.0。只不過每個顯示在彼此的頂部,易於讀取總數,但較難準確讀取每個的值。

import matplotlib.pyplot as plt

# 創建數據
x = range(1, 6)
y1 = [1, 4, 6, 8, 9]
y2 = [2, 2, 7, 10, 12]
y3 = [2, 8, 5, 10, 6]

# 生成圖表
plt.stackplot(x, y1, y2, y3, labels=['A', 'B', 'C'])
plt.legend(loc='upper left')
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/20163226ldnunKWTKd.png

27. 河流圖

河流圖是一種特殊(奇妙~)的流圖, 它圍繞着中心軸顯示,且邊緣是圓形的,從而形成流動的形狀。

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# 添加數據
x = np.arange(1990, 2020)
y = [np.random.randint(0, 5, size=30) for _ in range(5)]


def gaussian_smooth(x, y, grid, sd):
    """平滑曲線"""
    weights = np.transpose([stats.norm.pdf(grid, m, sd) for m in x])
    weights = weights / weights.sum(0)
    return (weights * y).sum(1)


# 自定義顏色
COLORS = ["#D0D1E6", "#A6BDDB", "#74A9CF", "#2B8CBE", "#045A8D"]

# 創建畫布
fig, ax = plt.subplots(figsize=(10, 7))

# 生成圖表
grid = np.linspace(1985, 2025, num=500)
y_smoothed = [gaussian_smooth(x, y_, grid, 1) for y_ in y]
ax.stackplot(grid, y_smoothed, colors=COLORS, baseline="sym")

# 顯示
plt.show()

https://ithelp.ithome.com.tw/upload/images/20230917/201632268ghDB21NX5.png

28. 時間序列圖

時間序列圖是指能夠展示數值演變的所有圖表(比如折線圖、柱狀圖、面積圖等等)

import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# 創建數據
my_count = ["France", "Australia", "Japan", "USA", "Germany", "Congo", "China", "England", "Spain", "Greece", "Marocco",
            "South Africa", "Indonesia", "Peru", "Chili", "Brazil"]
df = pd.DataFrame({
    "country": np.repeat(my_count, 10),
    "years": list(range(2000, 2010)) * 16,
    "value": np.random.rand(160)
})

# 創建網格
g = sns.FacetGrid(df, col='country', hue='country', col_wrap=4, )

# 添加曲線圖
g = g.map(plt.plot, 'years', 'value')

# 面積圖
g = g.map(plt.fill_between, 'years', 'value', alpha=0.2).set_titles("{col_name} country")

# 標題
g = g.set_titles("{col_name}")

# 總標題
plt.subplots_adjust(top=0.92)
g = g.fig.suptitle('Evolution of the value of stuff in 16 countries')

# 顯示
plt.show()

下面以一個時間序列面積圖爲例,顯示多組數據:
https://ithelp.ithome.com.tw/upload/images/20230917/20163226gBqBveKbhR.png

29. 地圖

繪製谷歌地圖風格的地圖圖表。

import pandas as pd
import folium

# 創建地圖對象
m = folium.Map(location=[20, 0], tiles="OpenStreetMap", zoom_start=2)

# 創建圖標數據
data = pd.DataFrame({
   'lon': [-58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5],
   'lat': [-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97],
   'name': ['Buenos Aires', 'Paris', 'melbourne', 'St Petersbourg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'],
   'value': [10, 12, 40, 70, 23, 43, 100, 43]
}, dtype=str)

# 添加信息
for i in range(0,len(data)):
    folium.Marker(
      location=[data.iloc[i]['lat'], data.iloc[i]['lon']],
      popup=data.iloc[i]['name'],
    ).add_to(m)

# 保存
m.save('map.html')

https://ithelp.ithome.com.tw/upload/images/20230917/20163226T3DIwA4ibG.png

30. 等值域地圖

等值域地圖,相同數值的範圍,顔色相同。

import pandas as pd
import folium

# 創建地圖對象
m = folium.Map(location=[40, -95], zoom_start=4)

# 讀取數據
state_geo = f"us-states.json"
state_unemployment = f"US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)

folium.Choropleth(
    geo_data=state_geo,
    ,
    data=state_data,
    columns=["State", "Unemployment"],
    key_on="feature.id",
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=.1,
    legend_,
).add_to(m)

folium.LayerControl().add_to(m)
# 保存
m.save('choropleth-map.html')

https://ithelp.ithome.com.tw/upload/images/20230917/20163226RoWHILiFjH.png

小總結

今天先說 30 個可視化圖表,剩下的 10 個我會在明天再分享給大家。同時,我在明天也會講到資料視覺化的應用。

我是 Mr. cobble,明天見!


上一篇
[Day 5] 資料視覺化 (Data Visualization)(上)
下一篇
[Day 7] 資料視覺化 (Data Visualization) (下)
系列文
圍繞 AI & Data 的主題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言